#ifndef __LOGGER_H__
#define __LOGGER_H__

#include "Marcos.h"
#include "spdlog/spdlog.h"
#include <spdlog/sinks/daily_file_sink.h> // 必须包含此头文件
#include <spdlog/sinks/stdout_sinks-inl.h> // 必须包含此头文件

/*-----------------set_pattern--------------------
%v	实际需要被日志记录的文本，如果文本中有{占位符}会被替换
%t	线程标识符
%P	进程标识符
%n	日志记录器名称
%l	日志级别
%L	日志级别简写
%^	转换为大写字母
%$	转换为彩色输出
%a	简写的周几，例如Thu
%A	周几，例如Thursday
%b	简写的月份，例如Aug
%B	月份，例如August
%c	日期时间，例如 Thu Aug 2315:35:46 2014
%C	两位年份，例如14
%Y	四位年份，例如2014
%D或%x	MM/DD/YY格式日期，例如"08/23/14
%m	月份，1-12之间
%d	月份中的第几天，1-31之间
%H	24小时制的小时，0-23之间
%l	12小时制的小时，1-12之间
%M	分钟，0-59
%S	秒，0-59
%e	当前秒内的毫秒，0-999
%f	当前秒内的微秒，0-999999
%F	当前秒内的纳秒，0-999999999
%p	AM或者PM
%r	12小时时间，例如 02:55:02 pm
%R	等价于%H:%M，例如23:55
%T或%X	HH:MM:SS
%z	时区UTC偏移，例如+02:00
%+	表示默认格式

--------------------------------------------*/

class LogMan 
{
public:
    // static std::shared_ptr<spdlog::logger>& instance(const std::string& filename = "") {
    static std::shared_ptr<spdlog::logger>& instance(const std::string& filename = "") 
    {
        static std::string config_filename = "Logs/my_daily_log_%Y-%m-%d.txt";
        static std::shared_ptr<spdlog::logger> logger;

        if (!filename.empty() && !logger) {
            config_filename = filename; // 仅在首次调用时生效
        }

        if (!logger) 
        {
            try
            {

                logger = spdlog::daily_logger_mt("global_logger", "Logs/my_daily_log_%Y-%m-%d.txt");

                logger->set_pattern("[%Y-%m-%d %T] [%^%L%$] [t:%t] %v");

                spdlog::flush_every(std::chrono::seconds(5));
            }
            catch (const spdlog::spdlog_ex& e) 
            {
                spdlog::error("File logger failed: {}", e.what());
            }
            
            
            // logger = spdlog::basic_logger_mt("global_logger", filename);
        }
        return logger;
    }

    // 重置日志器（允许运行时重新配置）
    static void reset(const std::string& new_filename = "") 
    {
        spdlog::drop("global_logger");
        if (!new_filename.empty()) 
        {
            instance(new_filename);
        }
    }

    //设置日志level
    static void Set_Level(int lvl)
    {
        if (auto logger = instance()) 
        {
            logger->set_level(static_cast<spdlog::level::level_enum>(lvl));
        }
    }

private:

    LogMan() = default;
    ~LogMan() = default;
    LogMan(const LogMan&) = delete;
    LogMan& operator=(const LogMan&) = delete;

};












#endif

